#! /usr/bin/env python3

# PyX_Demo_NumPy_Value-Filter_GF_2023-07-06.py

# Create By GF 2023-07-06 20:15

# ----------------------------------------------------------------------------------------------------

import numpy as np

# ----------------------------------------------------------------------------------------------------
# 1.按某些固定值筛选

# ndarray 中可以筛选出数值等于 3 的子数组和其在原数组中的索引位置。

arr = np.array([1, 1, 1, 134, 45, 3, 46, 45, 65, 3, 23424, 234, 12, 12, 3, 546, 1, 2])

# Output:

#>>> arr
#array([    1,     1,     1,   134,    45,     3,    46,    45,    65,
#           3, 23424,   234,    12,    12,     3,   546,     1,     2])

np.where(arr==3)

# Output:

#>>> np.where(arr==3)
#(array([ 5,  9, 14], dtype=int64),)

arr[np.where(arr == 3)]

# Output:

#>>> arr[np.where(arr == 3)]
#array([3, 3, 3])

# ----------------------------------------------------------------------------------------------------
# 2.按多个固定值筛选。

# 筛选多个固定值也是可行的，将不同条件用括号括起来，之间用 | 隔开即可。

arr = np.array([1, 1, 1, 134, 45, 3, 46, 45, 65, 3, 23424, 234, 12, 12, 3, 546, 1, 2])

# Output:

#>>> arr
#array([    1,     1,     1,   134,    45,     3,    46,    45,    65,
#           3, 23424,   234,    12,    12,     3,   546,     1,     2])

np.where((arr == 3) | (arr == 1))

# Output:

#>>> np.where((arr == 3) | (arr == 1))
#(array([ 0,  1,  2,  5,  9, 14, 16], dtype=int64),)

arr[np.where((arr == 3) | (arr == 1))]

# Output:

#>>> arr[np.where((arr == 3) | (arr == 1))]
#array([1, 1, 1, 3, 3, 3, 1])

# ----------------------------------------------------------------------------------------------------
# 3.按范围筛选。

# 除了按固定值，还可以按一定的范围进行筛选。

arr = np.array([1, 1, 1, 134, 45, 3, 46, 45, 65, 3, 23424, 234, 12, 12, 3, 546, 1, 2])

# Output:

#>>> arr
#array([    1,     1,     1,   134,    45,     3,    46,    45,    65,
#           3, 23424,   234,    12,    12,     3,   546,     1,     2])

np.where(arr > 3)

# Output:

#>>> np.where(arr > 3)
#(array([ 3,  4,  6,  7,  8, 10, 11, 12, 13, 15], dtype=int64),)

arr[np.where(arr > 3)]

# Output:

#>>> arr[np.where(arr > 3)]
#array([  134,    45,    46,    45,    65, 23424,   234,    12,    12,
#         546])

# 如果不需要 index，还可以有更快的方法。

arr[arr > 3]

# Output:

#>>> arr[arr > 3]
#array([  134,    45,    46,    45,    65, 23424,   234,    12,    12,
#         546])

# 那为什么还需要用 np.where 呢？
# 因为索引可以满足不同数组间的筛选。
# 比如有 A, B 两个数组，我们需要筛选出所有 A == 0 的 B 时即可使用 np.where 函数。

A = np.array([0, 0, 1, 1, 0, 1, 1, 0, 1])

# Output:

#>>> A
#array([0, 0, 1, 1, 0, 1, 1, 0, 1])

B = np.arange(len(A))

# Output:

#>>> B
#array([0, 1, 2, 3, 4, 5, 6, 7, 8])

B[np.where(A == 0)]

# Output:

#>>> B[np.where(A == 0)]
#array([0, 1, 4, 7])

# ----------------------------------------------------------------------------------------------------
# EOF
